package com.gaojiawei.multiThread18_CompletableFutureTask;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class L01_SupplyAsync {
    public static void main(String[] args) {
        testSupplyAsync();
    }

    /**
     * 生产者，可以指定返回结果。
     */
    public static void testSupplyAsync(){
        //CompletableFuture 内部如果没有提供线程池的话，默认使用的是forkjoinpool，是守护线程，如果main线程终止的话，守护线程也会终止
        //一般不建议使用默认的线程池，使用自定的线程池。
        CompletableFuture<String> completableFutureTask = CompletableFuture.supplyAsync(()->{
            System.out.println("task a is finisede");
            return "finish task a";
        });

        // join 和get的区别是 join是在内部处理了异常。而get没有抛出异常，所以get方法是会抛出异常的
        String res1 = completableFutureTask.join();

        String res2 = null;
        try {
             res2 = completableFutureTask.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        String res3 = completableFutureTask.join();

        System.out.println(res1+"'......"+res2+"''''''''"+res3);

    }
}
